#include <types.h>
#include <kernel/system.h>
#include <kernel/initcall.h>
#include <drivers/irq.h>
#include <drivers/gpio.h>
#include <kernel/syslog.h>
#include <kernel/kobject.h>
#include <irqnum.h>
#include <drivers/uart.h>
#include <string.h>
#include <os/task.h>

static void delay(int delay)
{
    for(volatile int i = 0; i<delay; i++)
        for(volatile int j=0;j<1000;j++);
}


void test_exit_handler(void)
{
    SYSLOG_INFO("test_exit_handler!\n");
    gpio_toggle_value(IO_PC13);
}

void vTask2Code(void *pvParameters) {
    for(;;) { // 无限循环
        gpio_set_value(IO_PC13, 1);
        SYSLOG_INFO("vTask2Code!");
        task_delay(10);
    }
}


// 第一个任务
void vTask1Code(void *pvParameters) {
    task_create(vTask2Code, "Task 2", 256, NULL, 1);
    for(;;) { // 无限循环
        gpio_set_value(IO_PC13, 1);
        SYSLOG_INFO("vTask1Code!");
        task_delay(10);
    }
}

// 第二个任务


int main(void)
{
    int ret = gpio_request(IO_PC13);
    if(ret) {
        return 0;
    }

    gpio_direction_output(IO_PC13, IO_HIGH);

    gpio_set_value(IO_PC13, 1);

    ret = gpio_request(IO_PA0);
    if(ret) {
        gpio_set_value(IO_PC13, 0);
        return 0;
    }

    int irq = gpio_to_irq(IO_PA0, IRQF_RISING);
    irq_request(irq, test_exit_handler);
    irq_enable(irq);

    SYSLOG_INFO("system start!\n");

    task_create(vTask1Code, "Task 1", 256, NULL, 1);

    // 启动调度器
    task_start_scheduler();

    // 如果一切正常，这个点不会被执行
    while(1);

    return 0;
}
